package etp.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import etp.client.ErroTarefa;
import etp.client.Tarefa;
import etp.client.rpc.TarefaAdminService;

public class TarefaAdminServiceImpl extends RemoteServiceServlet implements
TarefaAdminService {

	@Override
	public Tarefa cadastrar(Tarefa tar) {
		
		ErroTarefa erro = AdminTarefa.criarTarefa(tar);
		
		if(erro != ErroTarefa.SUCESSO){
			throw new RuntimeException(erro.msg());
		}
		
		return tar;
	}

	@Override
	public List<Tarefa> listar() {
		
		List<Tarefa> tarefas = AdminTarefa.listarTarefa();
		
		if(tarefas == null){
			return new ArrayList<Tarefa>();
		}
		
		/*
		 * Gambiarra para resolver o problema dos tipos array list retornados
		 * pelo BD
		 */
		ArrayList<Tarefa> tarefasAux = new ArrayList<Tarefa>();
		for(Tarefa t : tarefas){
			if(t.getDepende() == null) continue;
			ArrayList<String> dependents = new ArrayList<String>();
			
			for(String dep : t.getDepende()){
				dependents.add(dep);
			}

			t.setDepende(dependents);
			tarefasAux.add(t.copy());
		}
		
		
		
		return tarefasAux;
	}

	@Override
	public List<Tarefa> listarBy(int ord, String cod) {
		
		List<Tarefa> tarefas = AdminTarefa.listarTarefaBy(ord, cod);
		
		if(tarefas == null){
			return new ArrayList<Tarefa>();
		}
		
		/*
		 * Gambiarra para resolver o problema dos tipos array list retornados
		 * pelo BD
		 */
		ArrayList<Tarefa> tarefasAux = new ArrayList<Tarefa>();
		for(Tarefa t : tarefas){
			
			ArrayList<String> dependents = new ArrayList<String>();
			
			if(t.getDepende() != null){
				for(String dep : t.getDepende()){
					dependents.add(new String(dep));
				}
			}

			t.setDepende(dependents);
			tarefasAux.add(t.copy());
		}
		
		
		
		return tarefasAux;
	}

	@Override
	public String modificar(String cod, Tarefa t) {
		
		return AdminTarefa.modificarTarefa(cod, t).msg;
	}

	@Override
	public String remover(String cod) {
		
		ErroTarefa err = AdminTarefa.excluirTarefa(cod);
		
		if(err == ErroTarefa.SUCESSO){
			throw new RuntimeException(err.msg());
		}
		
		return cod;
	}

	@Override
	public boolean validaDependencia(String codOrigem, String codDestino,
			String codProjeto) {
		return AdminTarefa.validaDependencia(codOrigem, codDestino, codProjeto);
	}

	@Override
	public Date calcInitDate(Tarefa t) throws Exception {
	
		Date inicio = AdminTarefa.calculaInicio(t);
		
		return inicio;
	}

	@Override
	public String modificar(List<Tarefa> tarefas) throws Exception {
		return AdminTarefa.modificarTarefa(tarefas).msg;
	}

	@Override
	public List<Tarefa> search(String filtros) throws Exception{
		return AdminTarefa.searchTarefa(filtros);
	}

}
